package com.etc.threaddemo.notify;

/**
 * 自定义实体类
 *
 * @author Administrator
 */
public class Person {
    private String name;
    private String sex;

    //线程通信: 1 . 设置一个标记位
    boolean flag = false; //false表示的是还没有设置属性的值，true表示已经设了了属性的值

    /**
     * 得到当前对象信息
     */
    public synchronized void showPerson() {
        if (!flag) {
            //2-1. 逻辑判断中:  false表示的是还没有设置属性的值,就不显示，就等待wait
            try {
                wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

        }
        //显示属性的值
        System.out.println(this.name + "," + this.sex);

        //3-1. 改变flag的值 ,代码执行到这里，表示的是我的属性值显示已经完成了
        flag = false;

        //4-1. 唤醒其他线程: 我已经显示完成了，要告诉另外一一个线程，该干活了，设置属性的信息...
        notifyAll();
    }

    /**
     * 设置这个人的信息
     *
     * @param name
     * @param sex
     */
    public synchronized void setPerseon(String name, String sex) {

        //2-2  true表示已经设了了属性的值,不在设置，我们等待
        if (flag) {
            //等待
            try {
                wait();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        //设置属性的值
        this.name = name;
        this.sex = sex;

        //3-2  设置完成了，标记flag的值
        flag = true;

        //4-2 唤醒消费者线程
        notifyAll();
    }
}